package com.itheima.api.stream.demo03;

import java.util.ArrayList;
import java.util.stream.Stream;

/**
 * 演示的Stream流的中间操作
 */
public class StreamDemo01 {

    /**
     * Stream<T> filter(Predicate predicate)：用于对流中的数据进行过滤，Predicate接口中的方法boolean test(T t)对给定的参数进行判断，返回一个布尔值
     * Stream<T> limit(long maxSize)返回此流中的元素组成的流，截取前指定参数个数的数据
     * Stream<T> skip(long n)跳过指定参数个数的数据，返回由该流的剩余元素组成的流
     * static <T> Stream<T> concat(Stream a, Stream b)合并a和b两个流为一个流
     * Stream<T> distinct()返回由该流的不同元素（根据Object.equals(Object)）组成的流
     * Stream<T> sorted()返回由此流的元素组成的流，根据自然顺序排序
     * Stream<T> sorted(Comparator comparator)返回由该流的元素组成的流，根据提供的Comparator进行排序
     */
    public static void main(String[] args) {

        // 1. 创建一个ArrayList集合对象
        ArrayList<Integer> arrayList1 = new ArrayList<Integer>() ;

        // 添加元素
        arrayList1.add(23) ;
        arrayList1.add(56) ;
        arrayList1.add(12) ;
        arrayList1.add(33) ;
        arrayList1.add(78) ;
        arrayList1.add(100) ;

        // Stream<T> filter(Predicate predicate)
        // 需求：获取大于等于33的元素，并进行遍历，通过Stream流完成
        arrayList1.stream().filter( s -> {
            if(s >= 33) {
                return true ;
            }else  {
                return false ;
            }
        }).forEach( s -> System.out.println(s) );

        System.out.println("--------------------------------");

        // Stream<T> limit(long maxSize)返回此流中的元素组成的流，截取前指定参数个数的数据
        arrayList1.stream().limit(3).forEach( s -> System.out.println(s) );

        System.out.println("--------------------------------");

        // Stream<T> skip(long n)跳过指定参数个数的数据，返回由该流的剩余元素组成的流
        arrayList1.stream().skip(3).forEach( s -> System.out.println(s) );

        System.out.println("--------------------------------");

        // static <T> Stream<T> concat(Stream a, Stream b)合并a和b两个流为一个流
        ArrayList<Integer> arrayList2 = new ArrayList<Integer>();
        arrayList2.add(34) ;
        arrayList2.add(100) ;
        arrayList2.add(12) ;

        // 获取arrayList1这个集合对应的流对象
        Stream<Integer> stream1 = arrayList1.stream();

        // 获取arrayList2这个集合对应的流对象
        Stream<Integer> stream2 = arrayList2.stream();

        // 进行流的合并操作
        Stream<Integer> stream = Stream.concat(stream1, stream2);
        // stream.forEach( s -> System.out.println(s) );

        System.out.println("--------------------------------");

        // Stream<T> distinct()返回由该流的不同元素（根据Object.equals(Object)）组成的流
        // stream.distinct().forEach( s -> System.out.println(s) );

        System.out.println("--------------------------------");

        // Stream<T> sorted()返回由此流的元素组成的流，根据自然顺序排序
        // stream.distinct().sorted().forEach( s -> System.out.println(s) );

        // Stream<T> sorted(Comparator comparator)返回由该流的元素组成的流，根据提供的Comparator进行排序
        stream.distinct().sorted( (s1 , s2) -> s1 - s2).forEach( s -> System.out.println(s) );

    }


}
